﻿#region librerias
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//----Añado librerías necesarias
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Configuration;
using System.Windows.Forms;
using System.Collections;
#endregion

namespace Librerias
{
    #region excepciones
    //Excepciones de CADNoticia
    public class Excepcion_Conexion : Exception { override public string ToString() { return "Error en la conexión a la base de datos"; } }
    public class Excepcion_RegistroNoticia : Exception { override public string ToString() { return "No se ha podido registrar la noticia"; } }
    public class Excepcion_NoExisteCorreoEmisor : Exception { public override string ToString() { return "Sólo un Profesor o un Alumno pueden publicar noticias: ¡Compruebe emisor!"; } }
    public class Excepcion_NoExisteAsignatura : Exception { public override string ToString() { return "Asignatura para la que se va a publicar la Noticia no existe"; } }
    public class Excepcion_AsuntoVacio : Exception { public override string ToString() { return "Asunto de la noticia no puede ser vacío"; } }
    public class Excepcion_CuerpoVacio : Exception { public override string ToString() { return "Cuerpo de la noticia no puede ser vacío"; } }
    public class Excepcion_NoExisteCorreoProfesor : Exception { public override string ToString() { return "Correo no existe entre los profesores en eCampus"; } }
    public class Excepcion_NoExisteNoticia : Exception { public override string ToString() { return "Noticia no existe"; } }

    #endregion

    /// <summary>
    /// Clase: CAD Noticia
    /// </summary>
    public class CADNoticia
    {
        #region CADNoticia-doc
        /// <summary>
        /// Constructor vacío
        /// </summary>
        public CADNoticia()
        {
        }
        #endregion
        #region SubirArchivoADropbox y publicando una noticia-doc
        /// <summary>
        /// Subir Archivo A Dropbox y publicando una noticia
        /// </summary>
        /// <param name="entidadNoticia">EN Nueva Noticia</param>
        /// <param name="con">Conexión BD</param>
        /// <param name="barra">Barra de Progreso</param>
        private void SubirArchivoADropBox(ENNoticias entidadNoticia, SqlConnection c, ProgressBar barra)
        {
            CADGestionDropbox drop = new CADGestionDropbox();

            //Obtengo id
            string select = "select notId from noticias where "
                                    + "  notEmisor = '" + entidadNoticia.Emisor
                                    + "' and notReceptor = '" + entidadNoticia.Receptor
                                    + "' and notAsunto = '" + entidadNoticia.Asunto
                                    + "' and notMensaje = '" + entidadNoticia.Mensaje
                                    + "' and notArchivo = '" + entidadNoticia.Archivo + "'";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, c);
            DataTable res = new DataTable();
            adaptadorSQL.Fill(res);

            //Crea ruta de dropbox
            string ruta = "/noticias/" + res.Rows[0].ItemArray[0].ToString() + "/";
            drop.CreaDir(ruta);

            //Sube el fichero y actualiza la bd
            if (!(drop.Subir(entidadNoticia.Archivo, ruta, barra) &&
                new SqlCommand("update noticias set notArchivo = '" + ruta + CADGestionDropbox.GetFicheroFromRuta(entidadNoticia.Archivo) + "'" +
                                    "where notId = " + res.Rows[0].ItemArray[0].ToString() + ";", c).ExecuteNonQuery() != -1))
            {
                //Si algo falla elimina el campo archivo de la bd y lanza excepcion
                (new SqlCommand("update noticias set notArchivo = '' where notId = " + res.Rows[0].ItemArray[0].ToString() + ";", c)).ExecuteNonQuery();

                throw new Exception("Error al subir el fichero");
            }
        }

        public void NuevaNoticia(ENNoticias eNNoticia, ProgressBar barra)
        {
            SqlCommand command = null;          // Variable de comandos para ejecutar
            SqlConnection c = null;             // Variable de conexión a la DB

            //Compruebo que todo correcto
            //que exista el correoUsuario que envía
            if ((EsCorreoProfesor(eNNoticia.Emisor) == false) && (EsCorreoAlumno(eNNoticia.Emisor) == false)) throw new Excepcion_NoExisteCorreoEmisor();
            //que Asignatura en la que se va a publicar la noticia
            if (EsAsignatura(eNNoticia.Receptor) == false) throw new Excepcion_NoExisteAsignatura();
            //que asunto no sea vacío
            if (eNNoticia.Asunto == "") throw new Excepcion_AsuntoVacio();
            //que cuerpo no sea vacío
            if (eNNoticia.Mensaje == "") throw new Excepcion_CuerpoVacio();

            //comenzamos inserción en BD
            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();


                string query = "insert into noticias(notFechaCreacion,notEmisor, notReceptor,notAsunto,notMensaje,notArchivo, notVisibilidad) " +
                    "values(@FechaCreacion, @Emisor, @Receptor, @Asunto, @Mensaje, @Archivo, @Visibilidad);";


                // Establecimiento del comando a ejecutar
                command = new SqlCommand(query, c);
                command.Parameters.Add(new SqlParameter("@FechaCreacion", eNNoticia.FechaCreacion));
                command.Parameters.Add(new SqlParameter("@Emisor", eNNoticia.Emisor));
                command.Parameters.Add(new SqlParameter("@Receptor", eNNoticia.Receptor));
                command.Parameters.Add(new SqlParameter("@Asunto", eNNoticia.Asunto));
                command.Parameters.Add(new SqlParameter("@Mensaje", eNNoticia.Mensaje));
                command.Parameters.Add(new SqlParameter("@Archivo", eNNoticia.Archivo));
                command.Parameters.Add(new SqlParameter("@Visibilidad", eNNoticia.Visibilidad));

                // Ejecución del comando para insertar
                command.ExecuteNonQuery();


                //Conexión a DROPBOX. Si hay un archivo lo tiene que subir
                if (eNNoticia.Archivo != "")
                {
                    SubirArchivoADropBox(eNNoticia, c, barra);
                }
            }
            //Recojo si correoUsuario de propietario es malo
            catch (Excepcion_NoExisteCorreoEmisor)
            {
                throw new Excepcion_NoExisteCorreoEmisor();
            }
            finally
            {
                if ((c != null) && (c.State == System.Data.ConnectionState.Open))
                {
                    c.Close();
                    c.Dispose();
                }
            }
        }
        #endregion
        #region listaNoticias-doc
        /// <summary>
        /// Nos devolverá todas las noticias ya persistidas 
        /// </summary>
        /// <returns>Lista con estas</returns>
        public List<ENNoticias> listaNoticias()
        {
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<ENNoticias> listado = new List<ENNoticias>();  // Listado de noticias

            query = "select notFechaCreacion, notEmisor, notReceptor, notAsunto, notMensaje, notArchivo, notVisibilidad from noticias;";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    ENNoticias noticia = new ENNoticias();

                    noticia.Id = (int)reader["notId"];
                    noticia.FechaCreacion = (DateTime)reader["notFechaCreacion"];
                    noticia.Emisor = reader["notEmisor"].ToString();
                    noticia.Receptor = reader["notReceptor"].ToString();
                    noticia.Asunto = reader["notAsunto"].ToString();
                    noticia.Mensaje = reader["notMensaje"].ToString();
                    noticia.Mensaje = reader["notArchivo"].ToString();
                    noticia.Visibilidad = (int)reader["notVisibilidad"];

                    listado.Add(noticia);
                }
            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return listado;
        }
        #endregion
        #region FormateaFecha(string entrada)-doc
        /// <summary>
        /// Entra una fecha en formato 12/03/2012 07:01 y sale 2012-03-12 07:01
        /// </summary>
        /// <param name="entrada">string con la fecha</param>
        /// <returns>fecha ya formateada</returns>
        private string FormateaFecha(string entrada)
        {
            //Elimina espacios al principio y al final.
            entrada = entrada.Trim();

            string dia = "", mes = "", ano = "", res = entrada;



            int i = 0;
            if (entrada.Contains("/"))
            {

                //Extrae dia
                while (i < entrada.Length && entrada[i] != '/')
                {
                    dia += entrada[i];
                    i++;
                }
                if (dia.Length == 1)
                {
                    dia = "0" + dia;
                }
                i++;

                //Extrae mes
                while (i < entrada.Length && entrada[i] != '/')
                {
                    mes += entrada[i];
                    i++;
                }
                if (mes.Length == 1)
                {
                    mes = "0" + mes;
                }
                i++;

                //Extrae ano
                while (i < entrada.Length && entrada[i] != ' ')
                {
                    ano += entrada[i];
                    i++;
                }

                res = ano + "-" + mes + "-" + dia;

                if (entrada.Contains(':'))
                {
                    while (i < entrada.Length)
                    {
                        res += entrada[i];
                        i++;
                    }
                }
            }

            return res;
        }
        #endregion
        #region Buscar(string asignatura, string texto, int criterio)-doc
        /// <summary>
        /// Busca en las noticias de una asignatura, un texto, por un criterio
        /// </summary>
        /// <param name="asignatura">asignatura</param>
        /// <param name="texto">cadena a buscar</param>
        /// <param name="criterio">criterio de búsqueda elegido</param>
        /// <returns>DataTable con las coincidencias</returns>
        public DataTable Buscar(string asignatura, string texto, int criterio)
        {
            string select = "select * from noticias where notReceptor = '" + asignatura + "' and ";

            switch (criterio)
            {
                case 0:
                    select += " notAsunto like '%" + texto + "%'";
                    break;
                case 1:
                    select += " notMensaje like '%" + texto + "%'";
                    break;
                case 2:
                    select += " notEmisor like '%" + texto + "%'";
                    break;
                case 3:
                    select += " (CONVERT(varchar(20), notFechaCreacion, 20))  like '%" + FormateaFecha(texto) + "%'";
                    break;
            }

            select += " order by notFechaCreacion asc";

            DataTable res = new DataTable();
            SqlConnection con = new SqlConnection(CADConexion.connString);

            con.Open();
            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
            adaptadorSQL.Fill(res);
            con.Close();

            return res;
        }
        #endregion
        #region dimeNoticias-doc
        /// <summary>
        /// Nos devolverá todas las noticias persistidas
        /// </summary>
        /// <returns>Datatable con todas las noticias</returns>
        public DataTable dimeTodasNoticias()
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "select * from noticias order by notFechaCreacion asc";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeNoticiasSegunFecha-doc
        /// <summary>
        /// Nos dirá todas las noticias según una fecha
        /// </summary>
        /// <param name="fechita">fecha</param>
        /// <returns>DataTable con todas las noticias</returns>
        public DataTable dimeNoticiasSegunFecha(DateTime fechita)
        {
            string fechitaHasta;

            DataTable res = new DataTable();
            SqlConnection con = null;

            //monta fecha hasta
            if (fechita.Month > 10)
                fechitaHasta = fechita.Day.ToString() + "/" + fechita.Month.ToString() + "/" + fechita.Year.ToString() + " " + "23:59:59";
            else
                fechitaHasta = fechita.Day.ToString() + "/0" + fechita.Month.ToString() + "/" + fechita.Year.ToString() + " " + "23:59:59";

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "select notFechaCreacion, notEmisor, notReceptor, notAsunto, notMensaje, notArchivo, notVisibilidad from noticias where notFechaCreacion<='" + fechitaHasta + "' and notFechaCreacion>='" + fechita.ToString() + "' order by notFechaCreacion desc";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeNoticiasSegunProfesor-doc
        /// <summary>
        /// Proporcionará un listado de noticias dado un profesor 
        /// </summary>
        /// <param name="profesorcito">Correo del profesor</param>
        /// <returns>Tabla de datos con las noticias que ha publicado</returns>

        public DataTable dimeNoticiasSegunProfesor(string profesorcito)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            if (EsCorreoProfesor(profesorcito) == false)
            {
                throw new Excepcion_NoExisteCorreoProfesor();
            }
            else
            {
                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();

                    string select = "select * from noticias where notEmisor ='" + profesorcito + "'";
                    SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                    adaptadorSQL.Fill(res);

                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            }

            return res;
        }
        #endregion
        #region dimeNoticiasSegunMisAsignaturas-doc
        /// <summary>
        /// Nos devolverá todas las noticias según las asignaturas de un correo/usuario 
        /// </summary>
        /// <param name="profesorcito">Correo del usuario</param>
        /// <returns>DataTable con todas estas noticias</returns>
        public DataTable dimeNoticiasSegunMisAsignaturas(string profesorcito)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            if (EsCorreoProfesor(profesorcito) == false)
            {
                throw new Excepcion_NoExisteCorreoProfesor();
            }
            else
            {
                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();

                    string select = "select notFechaCreacion, notEmisor, notReceptor, notAsunto, notMensaje, notArchivo, notVisibilidad from noticias where notReceptor in(select turCodigo from turno where (turCorreo ='" + profesorcito + "'));";
                    SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                    adaptadorSQL.Fill(res);

                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            }

            return res;
        }
        #endregion
        #region dimeMisAsignaturas-doc
        /// <summary>
        /// Nos dirá las noticias publicadas por el usuario del correo
        /// </summary>
        /// <param name="profesorcito">correo</param>
        /// <returns>DataTable con todas ellas</returns>
        public DataTable dimeMisAsignaturas(string profesorcito)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            if (EsCorreoProfesor(profesorcito) == false)
            {
                throw new Excepcion_NoExisteCorreoProfesor();
            }
            else
            {
                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();

                    string select = "select distinct turCodigo from turno where (turCorreo ='" + profesorcito + "');";
                    SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                    adaptadorSQL.Fill(res);

                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            }

            return res;
        }
        #endregion
        #region bool Descargar(string rutaDrop, string rutaPC, ProgressBar barra)-doc
        /// <summary>
        /// Descargar una noticia con ficheros adjuntos
        /// </summary>
        /// <param name="rutaDrop">ruta en Dropbox</param>
        /// <param name="rutaPC">ruta en la que queremos descargar</param>
        /// <param name="barra">barra de progreso que actualizar</param>
        /// <returns>Si ha funcionado V, F en caso contrario</returns>
        public bool Descargar(string rutaDrop, string rutaPC, ProgressBar barra)
        {
            return new CADGestionDropbox().Descargar(rutaDrop, rutaPC, barra);
        }
        #endregion
        #region dimeNoticiasSegunUnaAsignatura-doc
        /// <summary>
        /// Nos dice todas las noticias de una asignatura
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeNoticiasSegunUnaAsignatura(string asignaturita)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            if (EsAsignatura(asignaturita) == false)
            {
                throw new Excepcion_NoExisteAsignatura();
            }
            else
            {
                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();

                    string select = "select * from noticias where notReceptor ='" + asignaturita + "';";
                    SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                    adaptadorSQL.Fill(res);

                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            }

            return res;
        }
        #endregion

        #region dimeNoticiasSegunUnaAsignaturaOrderByDataDESC-doc
        /// <summary>
        /// Nos dice todas las noticias de una asignatura ordenadas DESC por fecha
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeNoticiasSegunUnaAsignaturaOrderByDataDESC(string asignaturita)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            if (EsAsignatura(asignaturita) == false)
            {
                throw new Excepcion_NoExisteAsignatura();
            }
            else
            {
                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();

                    string select = "select * from noticias where notReceptor ='" + asignaturita + "' order by notFechaCreacion DESC;";
                    SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                    adaptadorSQL.Fill(res);

                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            }

            return res;
        }
        #endregion


        #region dimeNoticiasSegunUnaAsignaturaOrderByDataDESCConPuntos-doc
        /// <summary>
        /// Nos dice todas las noticias de una asignatura ordenadas DESC por fecha con sus puntos
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeNoticiasSegunUnaAsignaturaOrderByDataDESCConPuntos(string asignaturita)
        {
            DataTable res = new DataTable(), res2=null;
            DataRow[] resAux;
            SqlConnection con = null;

            ArrayList ar = new ArrayList();

            if (EsAsignatura(asignaturita) == false)
            {
                throw new Excepcion_NoExisteAsignatura();
            }
            else
            {
                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();
                    res2 = dimeTodasNoticiasOrderByDataDESCConPuntos();
                    resAux = res2.Select("notReceptor = '"+ asignaturita+"'");
                    res = resAux.CopyToDataTable();       
                                      
                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            }

            return res;
        }
        #endregion

        #region dimeTodasNoticiasOrderByDataDESCConPuntos-doc
        /// <summary>
        /// Nos dice todas las noticias de una asignatura ordenadas DESC por fecha con sus puntos y comentarios
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeTodasNoticiasOrderByDataDESCConPuntos()
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            ArrayList ar = new ArrayList();

                try
                {
                    con = new SqlConnection(CADConexion.connString);
                    con.Open();


                    string select = "SELECT        noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto,"+
                                    " noticias.notMensaje, noticias.notArchivo," + 
                                    " noticias.notVisibilidad,usuario.usuNombre, usuario.usuApellido1, " +
                                    "usuario.usuApellido2, usuario.usuImagen, numcomen.numero, puntuaciones.total  " +
                                    "FROM            noticias INNER JOIN " +
                                    "usuario ON noticias.notEmisor = usuario.usuCorreo LEFT OUTER JOIN " +
                                    "(SELECT        comUrl, COUNT(*) AS numero " +
                                    "FROM            comentarios " +
                                    "GROUP BY comUrl) AS numcomen ON 'N' + CONVERT(varchar, noticias.notId) = numcomen.comUrl LEFT OUTER JOIN " +
                                    "(SELECT        punUrl, SUM(punPuntos) AS total " +
                                    "FROM            puntos " +
                                    "GROUP BY punUrl) AS puntuaciones ON 'N' + CONVERT(varchar, noticias.notId) = puntuaciones.punUrl " +
                                    "ORDER BY noticias.notFechaCreacion DESC";



                    SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                    adaptadorSQL.Fill(res);

                }
                catch (SqlException ex)
                {
                    res = null;
                    throw ex;
                }
                finally
                {
                    if ((con != null) && (con.State == ConnectionState.Open))
                        con.Close();
                }
            

            return res;
        }
        #endregion
        #region dimeTodasNoticiasPublicas
        /// <summary>
        /// Nos dice todas las noticias publicas ordenadas DESC por fecha con sus puntos y comentarios
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataTable dimeTodasNoticiasPublicas()
        {
            DataTable res = new DataTable();
            DataTable resAux = null;
            SqlConnection con = null;

            ArrayList ar = new ArrayList();

            try
            {
                resAux = dimeTodasNoticiasOrderByDataDESCConPuntos();
                res = resAux.Select("notVisibilidad = 1").CopyToDataTable();    
                            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }

            return res;
        }
        #endregion



       









        #region dimeUnaNoticiaConPuntos-doc
        /// <summary>
        /// Nos dice todas las noticias de una asignatura ordenadas DESC por fecha con sus puntos
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataView dimeUnaNoticiaConPuntos(string id)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;
            DataView dv = null;
            ArrayList ar = new ArrayList();
            try
            {
                dv = new DataView( dimeTodasNoticiasOrderByDataDESCConPuntos());
                dv.RowFilter = "notId = '" + id + "'";            
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return dv;
        }
        #endregion




        #region noticias de mis asignaturas mas públicas
        /// <summary>
        /// Nos dice todas las noticias de una asignatura ordenadas DESC por fecha con sus puntos
        /// </summary>
        /// <param name="asignaturita">asignatura</param>
        /// <returns>DataTable con ellas</returns>
        public DataTable noticiasMisAsignaturasYPublicas(string usuario, int tipo)
        {
            DataTable res = new DataTable();
            DataRow [] dr;
            String lista = "";
            DataTable misAsignaturas = new DataTable();
            try
            {
                misAsignaturas = new ENAsignatura().ConsultaAsignaturasPorCorreoUsuYTipoDataTable(usuario, tipo);           
                lista = listar(misAsignaturas);
                dr = (dimeTodasNoticiasOrderByDataDESCConPuntos()).Select("notReceptor IN (" + lista + ") or notVisibilidad = 1");
                res = dr.CopyToDataTable();      
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }

            return res;
        }
        #endregion
        
        public String listar(DataTable asigs)
        {
            String sal = "";

            if (asigs.Rows.Count > 0) sal += "'" + asigs.Rows[0]["asiCodigo"].ToString() + "'";
            for (int i = 1; i < asigs.Rows.Count; i++)
            {
                sal += ",'" + asigs.Rows[i]["asiCodigo"].ToString().Trim() + "'";
            }
            return sal;
        }



        #region listaNoticiasDadaAsignatura-doc
        /// <summary>
        /// Lista noticias dada una asignatura
        /// </summary>
        /// <param name="unaAsignatura">asignatura</param>
        /// <returns>Lista con ellas</returns>
        public List<ENNoticias> listaNoticiasDadaAsignatura(string unaAsignatura)
        {
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<ENNoticias> listado = new List<ENNoticias>();  // Listado de noticias

            query = "select * from noticias where notReceptor='" + unaAsignatura + "';";

            if (EsAsignatura(unaAsignatura) == false)
            {
                throw new Excepcion_NoExisteAsignatura();
            }
            else
            {
                try
                {
                    // Establecimiento de conexión
                    c = new SqlConnection(CADConexion.connString);
                    c.Open();

                    // Ejecución de la instrucción
                    command = new SqlCommand(query, c);
                    reader = command.ExecuteReader();

                    // Recorrido de los datos obtenidos
                    while (reader.Read())
                    {
                        ENNoticias noticia = new ENNoticias();

                        noticia.FechaCreacion = (DateTime)reader["notFechaCreacion"];
                        noticia.Emisor = reader["notEmisor"].ToString();
                        noticia.Receptor = reader["notReceptor"].ToString();
                        noticia.Asunto = reader["notAsunto"].ToString();
                        noticia.Mensaje = reader["notMensaje"].ToString();
                        noticia.Mensaje = reader["notArchivo"].ToString();
                        noticia.Visibilidad = (int)reader["notVisibilidad"];

                        listado.Add(noticia);
                    }
                }
                catch (Exception)
                {
                    throw;
                }

                finally
                {
                    // Comprobación de conexión abierta
                    if ((c != null) && (c.State == ConnectionState.Open))
                    {
                        c.Close();
                    }
                }
            }

            return listado;
        }
        #endregion

        #region listaNoticiasDadoEmisor-doc
        /// <summary>
        /// Devuelve una lista con las noticias según un emisor de estas
        /// </summary>
        /// <param name="unEmisor">correo del emisor</param>
        /// <returns>Lista de ENNoticas con ellas</returns>
        public List<ENNoticias> listaNoticiasDadoEmisor(string unEmisor)
        {
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<ENNoticias> listado = new List<ENNoticias>();  // Listado de noticias

            query = "select * from noticias where notEmisor='" + unEmisor + "';";

            if (EsCorreoProfesor(unEmisor) == false)
            {
                throw new Excepcion_NoExisteCorreoProfesor();
            }
            else
            {
                try
                {
                    // Establecimiento de conexión
                    c = new SqlConnection(CADConexion.connString);
                    c.Open();

                    // Ejecución de la instrucción
                    command = new SqlCommand(query, c);
                    reader = command.ExecuteReader();

                    // Recorrido de los datos obtenidos
                    while (reader.Read())
                    {
                        ENNoticias noticia = new ENNoticias();

                        noticia.FechaCreacion = (DateTime)reader["notFechaCreacion"];
                        noticia.Emisor = reader["notEmisor"].ToString();
                        noticia.Receptor = reader["notReceptor"].ToString();
                        noticia.Asunto = reader["notAsunto"].ToString();
                        noticia.Mensaje = reader["notMensaje"].ToString();
                        noticia.Mensaje = reader["notArchivo"].ToString();
                        noticia.Visibilidad = (int)reader["notVisibilidad"];

                        listado.Add(noticia);
                    }
                }
                catch (Exception)
                {
                    throw;
                }

                finally
                {
                    // Comprobación de conexión abierta
                    if ((c != null) && (c.State == ConnectionState.Open))
                    {
                        c.Close();
                    }
                }
            }

            return listado;
        }
        #endregion

        #region actualizaNoticia-doc
        /// <summary>
        /// Actualiza Archivo DropBox dada una noticia
        /// </summary>
        /// <param name="u">EN Noticia</param>
        /// <param name="barra">Barra de progreso</param>
        private void ActualizaArchivoDropBox(ENNoticias u, ProgressBar barra)
        {
            //Si hay un archivo y no es la ruta de DropBox hay que reemplazar.
            // Hay que borrar el antigua, subir el nuevo y escribir su ruta en u.Archivo
            if (u.Archivo != "" && !u.Archivo.StartsWith("/"))
            {
                string rutaDropbox = "/noticias/" + u.Id + "/";

                CADGestionDropbox drop = new CADGestionDropbox();

                drop.Borrar(rutaDropbox);

                if (!drop.CreaDir(rutaDropbox))
                    throw new Exception("No se pudo crear la nueva ruta archivo");

                if (!drop.Subir(u.Archivo, rutaDropbox, barra))
                    throw new Exception("No se pudo cargar el archivo");

                u.Archivo = rutaDropbox + CADGestionDropbox.GetFicheroFromRuta(u.Archivo);
            }
        }


        public void actualizaNoticia(ENNoticias eNNoticia, ProgressBar barra = null)
        {
            SqlCommand command = null;          // Variable de comandos para ejecutar
            SqlConnection c = null;             // Variable de conexión a la DB
            string query = string.Empty;        // Instrucción a ejecutar en la DB


            //Compruebo que todo correcto
            //que exista el correoUsuario que envía
            if (EsCorreoProfesor(eNNoticia.Emisor) == false && (EsCorreoAlumno(eNNoticia.Emisor) == false)) throw new Excepcion_NoExisteCorreoEmisor();
            //que Asignatura en la que se va a publicar la noticia
            if (EsAsignatura(eNNoticia.Receptor) == false) throw new Excepcion_NoExisteAsignatura();
            //que asunto no sea vacío
            if (eNNoticia.Asunto == "") throw new Excepcion_AsuntoVacio();
            //que cuerpo no sea vacío
            if (eNNoticia.Mensaje == "") throw new Excepcion_CuerpoVacio();

            //comenzamos inserción en BD
            try
            {
                query = "update noticias " +
                    "set notFechaCreacion = @FechaCreacion, " +
                    "    notEmisor = @Emisor, " +
                    "  notReceptor = @Receptor, " +
                    "    notAsunto = @Asunto, " +
                    "   notMensaje = @Mensaje, " +
                    "   notArchivo = @Archivo, " +
                    "  notVisibilidad = @Visibilidad " +
                    "  where notId = @Id;";

                if (eNNoticia.Archivo != "")
                {
                    ActualizaArchivoDropBox(eNNoticia, barra);
                }

                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Establecimiento del comando a ejecutar
                command = new SqlCommand(query, c);
                command.Parameters.Add(new SqlParameter("@FechaCreacion", eNNoticia.FechaCreacion));
                command.Parameters.Add(new SqlParameter("@Emisor", eNNoticia.Emisor));
                command.Parameters.Add(new SqlParameter("@Receptor", eNNoticia.Receptor));
                command.Parameters.Add(new SqlParameter("@Asunto", eNNoticia.Asunto));
                command.Parameters.Add(new SqlParameter("@Mensaje", eNNoticia.Mensaje));
                command.Parameters.Add(new SqlParameter("@Archivo", eNNoticia.Archivo));
                command.Parameters.Add(new SqlParameter("@Visibilidad", eNNoticia.Visibilidad));
                command.Parameters.Add(new SqlParameter("@Id", eNNoticia.Id));

                // Ejecución del comando para insertar
                command.ExecuteNonQuery();


            }
            //Recojo si correoUsuario de propietario es malo
            catch (Excepcion_NoExisteCorreoEmisor)
            {
                throw new Excepcion_NoExisteCorreoEmisor();
            }

            finally
            {
                if ((c != null) && (c.State == System.Data.ConnectionState.Open))
                {
                    c.Close();
                    c.Dispose();
                }
            }
        }

        #endregion

        #region borraNoticia-doc
        /// <summary>
        /// Borrará una noticia dado su id
        /// </summary>
        /// <param name="id">identificador</param>
        public void borraNoticia(string id)
        {
            string query = "delete from noticias where notId = '" + id + "'";

            // Establecimiento de conexión
            SqlConnection c = new SqlConnection(CADConexion.connString);
            c.Open();

            // Establecimiento del comando a ejecutar
            new SqlCommand(query, c).ExecuteNonQuery();

            c.Close();
        }
        #endregion
        #region EsCorreoAdministrador-doc
        /// <summary>
        /// Nos dice si es correo de admin
        /// </summary>
        /// <param name="correoBuscado">posible correo de admin</param>
        /// <returns>V si es así</returns>
        public bool EsCorreoAdministrador(string correoBuscado)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuCorreo from usuario where usuCorreo='" + correoBuscado + "' and usuTipo=0;";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["usuCorreo"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = true;
                else
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region EsCorreoProfesor-doc
        /// <summary>
        /// Nos dice si correo de profesor
        /// </summary>
        /// <param name="correoBuscado">porsible correo</param>
        /// <returns></returns>
        public bool EsCorreoProfesor(string correoBuscado)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuCorreo from usuario where usuCorreo='" + correoBuscado + "' and usuTipo=1;";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["usuCorreo"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = true;
                else
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region EsCorreoAlumno-doc
        /// <summary>
        /// Nos dice si es correo de alumno
        /// </summary>
        /// <param name="correoBuscado">posible correo de alumno</param>
        /// <returns>V si lo es</returns>
        public bool EsCorreoAlumno(string correoBuscado)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuCorreo from usuario where usuCorreo='" + correoBuscado + "' and usuTipo=2;";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["usuCorreo"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = true;
                else
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region EsCorreoExistente-doc
        /// <summary>
        /// Nos diced si un correo existe
        /// </summary>
        /// <param name="correoBuscado">correo Buscado</param>
        /// <returns>V si existe</returns>
        public bool EsCorreoExistente(string correoBuscado)
        {
            bool salida = false;                                //devuelve si lo es o no

            if ((EsCorreoAdministrador(correoBuscado) == true) ||
               (EsCorreoProfesor(correoBuscado) == true) ||
               (EsCorreoAlumno(correoBuscado) == true))
                salida = true;

            return salida;
        }
        #endregion
        #region EsAsignatura-doc
        /// <summary>
        /// Saber si una cadena es una asignatura existente
        /// </summary>
        /// <param name="asignaturaBuscada">Asignatura a saber si existe</param>
        /// <returns>V si es así</returns>
        public bool EsAsignatura(string asignaturaBuscada)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select asiCodigo from asignatura where asiCodigo='" + asignaturaBuscada + "';";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string asignaturita;

                    asignaturita = reader["asiCodigo"].ToString();

                    listado.Add(asignaturita);
                }

                if (listado.Capacity != 0)
                    salida = true;
                else
                    salida = false;

            }
            catch (Exception ex)
            {
                throw ex;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region EsClaveValidaAdministrador-doc
        /// <summary>
        /// Testea si dada un correo y una clave coinciden para acceder
        /// </summary>
        /// <param name="correoAdministrador">correo</param>
        /// <param name="posibleClave">clave</param>
        /// <returns>V si es así</returns>
        public bool EsClaveValidaAdministrador(string correoAdministrador, string posibleClave)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select usuClave from usuario where ((usuCorreo='" + correoAdministrador + "') " +
                                                             "and (usuClave='" + posibleClave + "'));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string clavecita;

                    clavecita = reader["usuClave"].ToString();

                    listado.Add(clavecita);
                }

                if (listado.Capacity != 0)
                    //si ha rellenado será válido
                    salida = true;
                else
                    //sino no será válido
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion


        #region web
        #region dimeNoticiasWeb-doc
        /// <summary>
        /// Nos devolverá todas las noticias persistidas
        /// </summary>
        /// <returns>Datatable con todas las noticias</returns>
        public DataTable dimeTodasNoticiasWeb()
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "select notFechaCreacion, notEmisor, notReceptor, notAsunto, notMensaje, notArchivo from noticias order by notFechaCreacion asc";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeNoticiasPublicasWeb-doc-testeada
        /// <summary>
        /// Nos devolverá todas las noticias persistidas públicas
        /// </summary>
        /// <returns>Datatable con todas las noticias públicas</returns>
        public DataTable dimeTodasNoticiasPublicasWeb()
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "SELECT noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo " +
                              " FROM noticias " +
                              " WHERE (noticias.notVisibilidad = 1)" + //las que son públicas
                              " order by noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo";       
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeNoticiasPublicasWebPorAsignatura-doc-testeada
        /// <summary>
        /// Nos devolverá todas las noticias persistidas públicas
        /// </summary>
        /// <returns>Datatable con todas las noticias públicas</returns>
        public DataTable dimeNoticiasPublicasWebPorAsignatura(String codAsignatura)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "SELECT noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo " +
                              " FROM noticias " +
                              " WHERE ((noticias.notVisibilidad = 1) and (notReceptor = '" + codAsignatura + "'))" + //las que son públicas
                              " order by notFechaCreacion desc;";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region bool EsNoticiaExistente(int noticiaBuscada)-doc
        /// <summary>
        /// Si le pasamos una ID de noticia nos dice si existe o no
        /// </summary>
        /// <param name="noticiaBuscada">noticia buscada</param>
        /// <returns>V si está/returns>
        public bool EsNoticiaExistente(int noticiaBuscada)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<int> listado = new List<int>();                // Listado de noticia capturada

            query = "select * from noticias where notId=" + noticiaBuscada + ";";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    int noticiaSiEsta;

                    noticiaSiEsta = Convert.ToInt32(reader["notId"]);

                    listado.Add(noticiaSiEsta);
                }

                if (listado.Capacity != 0)
                    salida = true;
                else
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region dimePuntos-doc
        public int[] dimePuntos(int idDeNoticia)
        {
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            //0: positivos y 1: negativos  
            int[] PuntosSalida = new int[] { 0, 0 };

            if (EsNoticiaExistente(idDeNoticia) == false)
            {
                throw new Excepcion_NoExisteNoticia();
            }
            else
            {
                query = "select * from puntos where ((ptosTipoRecursoPuntuado = 0) and (ptosIdRecursoComentado=" + idDeNoticia + "));";

                try
                {
                    // Establecimiento de conexión
                    c = new SqlConnection(CADConexion.connString);
                    c.Open();

                    // Ejecución de la instrucción
                    command = new SqlCommand(query, c);
                    reader = command.ExecuteReader();

                    // Recorrido de los datos obtenidos
                    while (reader.Read())
                    {
                        if (Convert.ToInt32(reader["ptosEnUnidad"]) == 1)
                        {
                            PuntosSalida[0] = PuntosSalida[0] + 1;
                        }
                        else
                            {
                                PuntosSalida[1] = PuntosSalida[1] + 1;
                            }                        
                    }
                }
                catch (Exception)
                {
                    throw;
                }

                finally
                {
                    // Comprobación de conexión abierta
                    if ((c != null) && (c.State == ConnectionState.Open))
                    {
                        c.Close();
                    }
                }
            }
            return PuntosSalida;
        }
        #endregion
        #region bool esNoticiaVotada(string votante, int idNoticia) - doc
        /// <summary>
        /// Comprueba si esta persona ya ha votado esto
        /// </summary>
        /// <param name="votante">usuario que vota</param>
        /// <param name="idNoticia">id de la noticia a comprobar</param>
        /// <returns>V si ya este usuario ha votado ya. F en caso contrario</returns>
        public bool esNoticiaVotada(string votante, int idNoticia)
        {
            bool salida = false;                                //devuelve si lo es o no
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select * from puntos where ((ptosTipoRecursoComentado=0) and (ptosVotante='" + votante + "') and (ptosIdRecursoComentado=" + idNoticia +"));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["ptosVotante"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = true;
                else
                    salida = false;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region GetNoticiasSegunAsignaturasWeb(string asignatura)
        public DataTable GetNoticiasSegunAsignaturasWeb(string asignatura)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "SELECT noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo, sum(puntos.ptosEnUnidad) as suma " +
                              " FROM noticias INNER JOIN puntos ON noticias.notId = puntos.ptosIdRecursoComentado " +
                              " WHERE ((puntos.ptosTipoRecursoPuntuado = 0) and " +
                              "        (notReceptor = '" + asignatura + "')) " +  
                              " GROUP BY noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo" +
                              " order notFechaCreacion desc";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);

            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeNoticiasWebSegunProfesor
        public DataTable dimeTodasNoticiasWebSegunProfesor(string unProfesor)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "SELECT distinct noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo " +
                                "FROM noticias, turno " +
                                "WHERE (noticias.notReceptor = turno.turCodigo) and " +  
                                "      (turCorreo = '" + unProfesor + "')" +
                                " order by notFechaCreacion desc;";
                              
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeNoticiasWebSegunAlumno
        public DataTable dimeTodasNoticiasWebSegunAlumno(string unAlumno)
        {
            DataTable res = new DataTable();
            SqlConnection con = null;

            try
            {
                con = new SqlConnection(CADConexion.connString);
                con.Open();

                string select = "SELECT distinct noticias.notId, noticias.notFechaCreacion, noticias.notEmisor, noticias.notReceptor, noticias.notAsunto, noticias.notMensaje, noticias.notArchivo " +
                                "FROM noticias, cursar " +
                                "WHERE (noticias.notReceptor = cursar.curCodigo) and " +
                                "      (curCorreo = '" + unAlumno + "')" +
                                " order by notFechaCreacion desc;";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);
                adaptadorSQL.Fill(res);
            }
            catch (SqlException ex)
            {
                res = null;
                throw ex;
            }
            finally
            {
                if ((con != null) && (con.State == ConnectionState.Open))
                    con.Close();
            }

            return res;
        }
        #endregion
        #region dimeLaUltimaNoticia(string autor)
        public DataTable dimeLaUltimaNoticia(string autor)
        {
            DataTable res = null;
            SqlConnection conn = new SqlConnection(CADConexion.connString);

            try
            {
                conn.Open();
                string select = "select notId " +
                                 "from noticias " +
                                 "where (notEmisor='" + autor + "') and " +
                                 "notId=(select max(notId) from noticias where (notEmisor='" + autor + "'));";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, conn);
                res = new DataTable();
                adaptadorSQL.Fill(res);
            }
            catch (NullReferenceException)
            {
                throw;
            }
            catch (SqlException)
            {
                throw;
            }
            finally
            {
                conn.Close();
            }

            return res;
        }
        #endregion
        #region NuevaNoticiaWeb(ENNoticias eNNoticia)
        public void NuevaNoticiaWeb(ENNoticias eNNoticia)
        {
            SqlCommand command = null;          // Variable de comandos para ejecutar
            SqlConnection c = null;             // Variable de conexión a la DB

            //Compruebo que todo correcto
            //que exista el correoUsuario que envía
            if ((EsCorreoProfesor(eNNoticia.Emisor) == false) && (EsCorreoAlumno(eNNoticia.Emisor) == false)) throw new Excepcion_NoExisteCorreoEmisor();
            //que Asignatura en la que se va a publicar la noticia
            if (EsAsignatura(eNNoticia.Receptor) == false) throw new Excepcion_NoExisteAsignatura();
            //que asunto no sea vacío
            if (eNNoticia.Asunto == "") throw new Excepcion_AsuntoVacio();
            //que cuerpo no sea vacío
            if (eNNoticia.Mensaje == "") throw new Excepcion_CuerpoVacio();

            //comenzamos inserción en BD
            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();


                string query = "insert into noticias(notFechaCreacion,notEmisor, notReceptor,notAsunto,notMensaje,notArchivo, notVisibilidad) " +
                    "values(@FechaCreacion, @Emisor, @Receptor, @Asunto, @Mensaje, @Archivo, @Visibilidad);";


                // Establecimiento del comando a ejecutar
                command = new SqlCommand(query, c);
                command.Parameters.Add(new SqlParameter("@FechaCreacion", eNNoticia.FechaCreacion));
                command.Parameters.Add(new SqlParameter("@Emisor", eNNoticia.Emisor));
                command.Parameters.Add(new SqlParameter("@Receptor", eNNoticia.Receptor));
                command.Parameters.Add(new SqlParameter("@Asunto", eNNoticia.Asunto));
                command.Parameters.Add(new SqlParameter("@Mensaje", eNNoticia.Mensaje));
                command.Parameters.Add(new SqlParameter("@Archivo", eNNoticia.Archivo));
                command.Parameters.Add(new SqlParameter("@Visibilidad", eNNoticia.Visibilidad));

                // Ejecución del comando para insertar
                command.ExecuteNonQuery();
            }
            //Recojo si correoUsuario de propietario es malo
            catch (Excepcion_NoExisteCorreoEmisor)
            {
                throw new Excepcion_NoExisteCorreoEmisor();
            }
            finally
            {
                if ((c != null) && (c.State == System.Data.ConnectionState.Open))
                {
                    c.Close();
                    c.Dispose();
                }
            }
        }
        #endregion
        #region int numeroNoticiasPorUsuario(string votante)
        public int numeroNoticiasPorUsuario(string votante)
        {
            int salida = 0;                                     //en ppio 0 noticias
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select count(notId) as totalNoticias from noticias where (notEmisor='" + votante + "');";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["totalNoticias"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = int.Parse(listado[0]);
                else
                    salida = 0;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region int numeroVotosPorUsuario(string votante)
        public int numeroVotosPorUsuario(string votante)
        {
            int salida = 0;                                     //en ppio 0 noticias
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select count(*) as totalVotos from puntos where ((punCorreo='" + votante + "') and (punUrl like 'N%'));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["totalVotos"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = int.Parse(listado[0]);
                else
                    salida = 0;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #region int numeroVotosPorUsuario(string votante)
        public int numeroComentariosPorUsuario(string comentarista)
        {
            int salida = 0;                                     //en ppio 0 noticias
            SqlConnection c = null;                             // Variable de conexión a la DB
            SqlCommand command = null;                          // Variable para la ejecución de comandos
            SqlDataReader reader = null;                        // Almacenador de datos obtenidos
            string query = string.Empty;                        // Instrucción a ejecutar
            List<string> listado = new List<string>();          // Listado de correos capturados

            query = "select count(*) as totalComentarios from comentarios where ((comCorreo='" + comentarista + "') and (comUrl like 'N%'));";

            try
            {
                // Establecimiento de conexión
                c = new SqlConnection(CADConexion.connString);
                c.Open();

                // Ejecución de la instrucción
                command = new SqlCommand(query, c);
                reader = command.ExecuteReader();

                // Recorrido de los datos obtenidos
                while (reader.Read())
                {
                    string correito;

                    correito = reader["totalComentarios"].ToString();

                    listado.Add(correito);
                }

                if (listado.Capacity != 0)
                    salida = int.Parse(listado[0]);
                else
                    salida = 0;

            }
            catch (Exception)
            {
                throw;
            }

            finally
            {
                // Comprobación de conexión abierta
                if ((c != null) && (c.State == ConnectionState.Open))
                {
                    c.Close();
                }
            }

            return salida;
        }
        #endregion
        #endregion
    }
}

